
import java.util.Date;
import java.text.SimpleDateFormat;

class SolicitacaoController {

    VagaService vagaService;
    SolicitacaoService solicitacaoService;
    TceService tceService;

    /*
     * Closure que lista as solicitações de estágio geradas pela Unidade Concedente.
    */
    def list   = {
        if(!verificaLogon()){
            return;
        }
        Date hoje = new Date();
        SimpleDateFormat formatador = new SimpleDateFormat('dd-MM-yyyy hh:MM:ss');
        params.max = Math.min(params.max ? params.int('max') : 10, 100);
        
        def solicitacoes = Solicitacao.list(params);
        for(Solicitacao s: solicitacoes){
            s.permiteRenovarTce = tceService.verificaTceAnterior(s);
            s.permiteCriarTce   = tceService.possuiTceAnterior(s);
        }
        [solicitacaoInstanceList  : solicitacoes,
         solicitacaoInstanceTotal : Solicitacao.count(),
         hoje                     : hoje.format('dd-MM-yyyy hh:MM:ss')]
    }

    


    /*
     * Closure que gera a solicitação de estágio.
     */
    def gerarSolicitacao = {
        if(!verificaLogon()){
            return;
        }
        // Formata a data.
        Date data = new Date();
        SimpleDateFormat formatador = new SimpleDateFormat('yyyy/MM/dd hh:MM:ss');

        // Carrega os dados do envio do curriculo para a vaga.
        def envioVagaInstance  = EnvioVaga.findById(params.id);
        def vagaInstance       = Vaga.findById(envioVagaInstance.vaga.id);

        def results = AgenteIntegracao.list();
        results = results[0];

        // Instancia e monta a solicitação.
        def solicitacaoInstance              = new Solicitacao();
        solicitacaoInstance.estagiario       = Estagiario.findById(envioVagaInstance.estagiario.id);
        solicitacaoInstance.vaga             = vagaInstance;
        solicitacaoInstance.situacao         = "0";
        solicitacaoInstance.dtCadastro       = Date.parse('yyyy/MM/dd hh:MM:ss',formatador.format(data));
        solicitacaoInstance.agenteIntegracao = results//results.id;
        // Verifica se o estagiário já possui solicitação gerada para outra vaga.
        if(!solicitacaoService.possuiSolicitacao(Estagiario.get(envioVagaInstance.estagiario.id))){
            // Verifica se tem vagas disponível e se a vaga esta ativa.
            if(vagaService.possuiVagasAbertas(vagaInstance) && vagaService.vagaEstaAtiva(vagaInstance) && !vagaService.vagaEstaFechada(vagaInstance)){
                // Decrementa a quantidade de vagas.
                if(vagaService.diminuirVaga(vagaInstance)){
                    // Gera a solicitação.
                    if(solicitacaoInstance.save(flush: true)){
                        flash.message = "Solicitação gerada com sucesso!";
                        redirect(controller:'vaga', action:'edit', id:envioVagaInstance.vaga.id);
                    }else{
                        flash.message = "Não foi possível gerar a solicitação. ERRO 45.";
                        redirect(controller:'vaga', action:'edit', id:envioVagaInstance.vaga.id);
                    }
                }else{
                    flash.message = "Não foi possível gerar a solicitação. ERRO 35.";
                    redirect(controller:'vaga', action:'edit', id:envioVagaInstance.vaga.id);
                }
            }else{
                flash.message = "Não foi possível gerar a solicitação.<br/> Não existem vagas disponiveis, a vaga esta inativa ou fechada.";
                redirect(controller:'vaga', action:'edit', id:envioVagaInstance.vaga.id);
            }
        }else{
            flash.message = "Não foi possível gerar a solicitação.<br/> Já existe solicitação para este estagiário.";
            redirect(controller:'vaga', action:'edit', id:envioVagaInstance.vaga.id);
        }
    }

    /*
     * Closure que exclui uma solicitação de estágio.
     * A solicitação de estágio só pode ser excluída se ainda não tiver TCE vinculado.
     */
    def excluirSolicitacao = {
        if(!verificaLogon()){
            return;
        }
        Solicitacao solicitacao = Solicitacao.get(params.id)
        Vaga vagaInstance       = Vaga.findById(solicitacao.vaga.id);
        String controlador      = params.controlador;
        String acao             = params.acao;
        //int vaga                = solicitacao.vaga.id;
        // Verifica se a solicitação possui tce vinculado.
        if(!solicitacaoService.possuiTce(solicitacao)){
            if(vagaService.aumentarVaga(vagaInstance)){
                solicitacao.delete();
                flash.message = "Solicitacao excluída com sucesso.";
                redirect(controller:controlador, action:acao, id:vagaInstance.id);
            }else{
                flash.message = "Não foi possível excluir a solicitação.";
                redirect(controller:controlador, action:acao, id:vagaInstance.id);
            }
        }else{
            flash.message = "Não é possivel excluir uma solicitação que já possui TCE.";
            redirect(controller:controlador, action:acao, id:vagaInstance.id);
        }

    }

    /*
     * Método que verifica se o usuário está logado.
     * Se não estiver logado é redirecionado para home
     */
    private boolean verificaLogon() {
        if(!session["pessoa"]){
            flash.message = "Você precisa estar logado para acessar esta página.";
            redirect(controller:'login', action:'auth');
            return false;
        }

        return true;
    }
    
}
